//
//  JXLSportMapViewController.m
//  JXLSport
//
//  Created by 贾晓磊 on 16/10/24.
//  Copyright © 2016年 贾晓磊. All rights reserved.
//

#import "JXLSportMapViewController.h"
#import <MAMapKit/MAMapKit.h>
#import "JXLSportTrackingLine.h"
#import "JXLCircleAnimator.h"
#import "JXLSportMapModeViewController.h"
@interface JXLSportMapViewController () <MAMapViewDelegate,UIPopoverPresentationControllerDelegate>
//总距离
@property (weak, nonatomic) IBOutlet UILabel *distanceLabel;
//总时长
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
@end

@implementation JXLSportMapViewController {
    /// 起始位置
    CLLocation *_startLocation;
    // 同心圆转场动画器
    JXLCircleAnimator *_circleAnimator;
    // 是否设置起点
    BOOL _hasSetStartLocation;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if ([super initWithCoder:aDecoder]) {
        //1,展现样式设置为自定义
        self.modalPresentationStyle = UIModalPresentationCustom;
        //2,设置转场代理
        _circleAnimator = [JXLCircleAnimator new];
        self.transitioningDelegate = _circleAnimator;
    }
    return self;
}

- (void)awakeFromNib {
    [super awakeFromNib];
    
    [self setupMapView];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //[self setupMapView];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    //1,判断跳转控制器的类型
    if (![segue.destinationViewController isKindOfClass:[JXLSportMapModeViewController class]]) {
        return;
    }
    // 2. 验证 popover 和传统模态之间的区别，如果要自定义 popover 的样式，就可以通过 popoverPresentationController
    NSLog(@"%@",segue.destinationViewController.popoverPresentationController);
    //3,设置代理
    segue.destinationViewController.popoverPresentationController.delegate = self;
}

#pragma mark UIPopoverPresentationControllerDelegate
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
    //不让系统自适应 
    return UIModalPresentationNone;
}

#pragma mark - MAMapViewDelegate
/**
 * @brief 位置或者设备方向更新后，会调用此函数
 * @param mapView 地图View
 * @param userLocation 用户定位信息(包括位置与设备方向等数据) 是一个固定的对象
 * @param updatingLocation 标示是否是location数据更新, YES:location数据更新 NO:heading数据更新
 */
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation {
    // 0. 判断 `位置数据` 是否变化 - 不一定是经纬度变化！
    if (!updatingLocation) {
        return;
    }
    
    // 1. 判断运动状态，只有`继续`才需要绘制运动轨迹
    if (_sportTracking.sportState != JXLSportStateContinue) {
        return;
    }
    
    // 将用户位置设置在地图视图的中心点
    [mapView setCenterCoordinate:userLocation.coordinate animated:YES];
    
    //大概一秒更新一次
    //NSLog(@"%@,%p",userLocation.location,userLocation.location);
    // 判断起始位置是否存在
    // 在所有的地图框架中，在最开始定位的时候，尤其在室内定位非常糟糕，通常位置不准确！
    // 当用户在 户外 运动 的时候，定位会非常准确！
    if (!_hasSetStartLocation && _sportTracking.sportStartLocation != nil) {
        _startLocation = userLocation.location;
        // 1. 实例化大头针
        MAPointAnnotation *annotation = [[MAPointAnnotation alloc] init];
        // 2. 指定坐标位置
        annotation.coordinate = _sportTracking.sportStartLocation.coordinate;
        // 3. 添加到地图视图
        [mapView addAnnotation:annotation];
    }
    //绘制轨迹模型
    [mapView addOverlay:[_sportTracking appendLocation:userLocation.location]];
    
    [self updateUIDisplay];
}


/**
 更新UI显示
 */
- (void)updateUIDisplay {
    //设置距离
    _distanceLabel.text = [NSString stringWithFormat:@"%02f",_sportTracking.totalDistance];
    //设置时间
    _timeLabel.text = _sportTracking.totalTimeString;
}

/**
 * @brief 单击地图回调，返回经纬度
 * @param mapView 地图View
 * @param coordinate 经纬度
 */
- (void)mapView:(MAMapView *)mapView didSingleTappedAtCoordinate:(CLLocationCoordinate2D)coordinate {
//    // 开始画线
//    // 1.创建轨迹追踪线条模型
//    CLLocation *endLocation = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
//    JXLSportTrackingLine *trackingLine = [[JXLSportTrackingLine alloc] initWithStartLocation:_startLocation endLocation:endLocation];
//    // 2. 向地图添加折线对象
//    [mapView addOverlay:trackingLine.polyLine];
    [self dismissViewControllerAnimated:YES completion:nil];
}

// 需要实现MAMapViewDelegate的-mapView:rendererForOverlay:
- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id<MAOverlay>)overlay {
    // 1. 判断 overlay 的类型
    if (![overlay isKindOfClass:[MAPolyline class]]) {
        return nil;
    }
    // 2. 实例化折线渲染器
    JXLSportPolyLine *polyLine = (JXLSportPolyLine *)overlay;
    MAPolylineRenderer *renderer = [[MAPolylineRenderer alloc] initWithOverlay:polyLine];
    // 3. 设置显示属性
    renderer.lineWidth = 5;
    // TODO: 如果能够根据速度知道不同的颜色就好了
    renderer.strokeColor = polyLine.color;
    
    return renderer;

}

- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation {
    //0,判断大头针的类型
    if (![annotation isKindOfClass:[MAPointAnnotation class]]) {
        return nil;
    }
    // 1. 查询可重用大头针视图
    static NSString *annotaionId = @"annotaionId";
    MAAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotaionId];
    // 2. 如果没有查到，新建视图
    if (annotationView == nil) {
        annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotaionId];
    }
    // 3. 设置大头针视图 - 设置图像
    // 根据运动类型来创建运动图像
    UIImage *image = _sportTracking.sportImage;
    annotationView.image = image;
    annotationView.centerOffset = CGPointMake(0, -image.size.height * 0.5);
    
    // 4. 返回自定义大头针视图
    return annotationView;

}

#pragma mark 设置地图视图
- (void)setupMapView {
    // 1. 实例化地图视图
    MAMapView *mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
    // 2. 添加到根视图
    //[self.view addSubview:mapView];
    [self.view insertSubview:mapView atIndex:0];
    // 3. 隐藏比例尺
    mapView.showsScale = NO;
    // 4. 关闭相机旋转 - 能够降低能耗，省电
    mapView.rotateCameraEnabled = NO;
    //5. 显示用户位置
    mapView.showsUserLocation = YES;
    // 6. 跟踪用户位置 - 追踪用户的location与heading更新/会放大地图的显示，将用户设置在地图的中心点
    mapView.userTrackingMode = MAUserTrackingModeFollowWithHeading;
    // 7. 允许后台定位 - 保证 Background Modes 中的 Location updates 处于选中状态
    mapView.allowsBackgroundLocationUpdates = YES;
    // 8. 不允许系统暂停位置更新
    mapView.pausesLocationUpdatesAutomatically = NO;
    // 9. 设置代理
    mapView.delegate = self;
    // 10. 纪录地图
    _mapView = mapView;
}
@end
